會有測試替身的出現,要先介紹「被測試目標」(SUT, System Under Test)與「被依賴組件」(DOC, Depended-on Component)。SUT 是我們想要測試的目標,但因為其會受到 DOC 的影響,為了區隔出想要測試的目標,因此我們需要測試替身,來隔離出 SUT。
測試替身(Test Double),是由 Gerard Meszaros 於《xUnit Test Patterns》中所提出,並且他提出了五個種類。分別為: Dummy、Stub、Spy、Mock、Fake。
Dummy
所謂的 Dummy,有點像是為了測試,要填充一個假的物件,也可以是一個空物件、空值。該物件與要測試的案例完全無關。
Stub
Stub 有點像是一個可控的假物件,需要有這個假物件存在,才可以讓 SUT 避免受到 DOC 的影響。在 jest 中可使用 jest.fn()
搭配 mockReturnValue() 來指定一個 stub 的行為;在 mocha.js 中則可使用 sinon 的 sinon.stub()
。
Spy
Spy,監視,用以監控「SUT 與 DOC」之間的互動。在 jest 中可使用 jest.spyOn()
;在 mocha.js 則可使用 sinon.spy()
。
Mock
Mock 可以用來檢視「SUT 有沒有正確使用 stub、spy 等 DOC 的替身」。用以間接性的證明「SUT 在使用 DOC」是否如預期。在 jest 中可以使用 jest.mock()
;在 mocha.js 中則可以使用 sinon.mock()
。
Fake
最後,Fake 則是輕量版、簡化的 DOC。產生一個小的、假的、具備 DOC 該具備的功能的假物件。